package com.xbai.spark.core.action

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
  * aggregate 算子
  * 作用：aggregate 函数将每个分区里面的元素通过 seqOp 和初始值进行聚合，
  * 然后用 combine 函数将每个分区的结果和初始值 (zeroValue) 进行 combine 操作。
  * 这个函数最终返回的类型不需要和RDD 中元素类型一致。
  *
  * 参数：(zeroValue: U)(seqOp: (U, T) ⇒ U, combOp: (U, U) ⇒ U)
  *
  * @author xbai
  * @Date 2020/12/31
  */
object Spark07_Aggregate {

  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("aggregate")
    val sc = new SparkContext(conf)

    val rdd: RDD[Int] = sc.parallelize(1 to 10, 2)
    rdd.glom().collect().foreach(x => println(x.mkString(", ")))
    val result: Int = rdd.aggregate(0)(_ + _, _ + _)
    println(result)

    val result2: Int = rdd.aggregate(5)(_ + _, _ + _)
    println(result2)
    sc.stop()
  }
}
